﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Ext.Net;
using FastTravel.BusinessLogic;
using FastTravel.Utilites;

namespace FastTravel.IntranetWeb
{
	/// <summary>
	/// Страница управления странами
	/// </summary>
	public partial class Country : BasePage
	{
		/// <summary>
		/// Загрузка страницы
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void Page_Load(object sender, EventArgs e)
		{
			
		}

		
		/// <summary>
		/// Поиск (добавление фильтров)
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e">Параметры запроса</param>
		protected void BtnSearchCountryClick(object sender, DirectEventArgs e)
		{
			grdCountry.Reload();
			toolbarBottomPaging.SetPageIndex(0);
		}

		/// <summary>
		/// Получение списка стран
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e">Параметры запроса</param>
		protected void StoreRefresh(object sender, StoreRefreshDataEventArgs e)
		{
			string filterByName = txtFilterCountryName.Text == "" ? string.Empty : txtFilterCountryName.Text;
			string filterByCode = txtFilterCountryCode.Text == "" ? string.Empty : txtFilterCountryCode.Text;

			//todo: доделать фильтр по iso 

			//string filterByISO = txtFilterCountryISO.Text == "" ? string.Empty : txtFilterCountryName.Text;
			string filterByISO = string.Empty;

			int totalCount = 0;
			var countryList = CountryManager.GetPage(e.Start, e.Limit, e.Sort, e.Dir.ToString(), filterByName, filterByCode, filterByISO, out totalCount);
			e.Total = totalCount;

			this.grdCountry.GetStore().DataSource = countryList;
		}

		/// <summary>
		/// События таблицы стран
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e">Аргумент с командами</param>
		public void GridAction(object sender, DirectEventArgs e)
		{
			int id = int.Parse(e.ExtraParams["id"]);
			switch (e.ExtraParams["command"])
			{
				case "Edit":
					ShowEditWindow(id);
					break;
				case "Delete":
					if (CountryManager.HasResort(id))
					{
						ExtNet.Msg.Notify("Ошибка", "Сначала удалите курорты в этой стране!").Show();
					}
					else
					{
						CountryManager.Delete(id);
						if (BusinessLogicManager.TryCommit())
						{
							ExtNet.Msg.Notify("Сообщение", "Страна удалена!").Show();
							grdCountry.Reload();
						}
						else
						{
							ExtNet.Msg.Notify("Ошибка", "Невозможно удалить страну!").Show();
						}
					}
					break;
			}
		}

		/// <summary>
		/// Открытие окна для добавления новой страны
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void BtnAddCountryClick(object sender, DirectEventArgs e)
		{
			winCountryNew.Show();
		}

		/// <summary>
		/// Добавление новой страны в БД
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void BtnConfirmNewCountry(object sender, DirectEventArgs e)
		{
			if (CountryManager.IsExsist(txtCountryNameNew.Text.Trim()))
			{
				ExtNet.Msg.Notify("Сообщение", "Страна с таким названием уже есть! Выберите другое название!").Show();
				txtCountryNameNew.Text = "";
				txtCountryNameNew.Focus();
				return;
			}
			else
			{
				string countryName = TextFormatHelper.FormatName(txtCountryNameEdit.Text);
				string countryCode = txtCountryCodeEdit.Text.ToUpper().Trim();
				int countryIso = int.Parse(txtCountryISOEdit.Text);

				CountryManager.Add(countryName, countryCode, countryIso);

				if (BusinessLogicManager.TryCommit())
				{
					ExtNet.Msg.Notify("Сообщение", "Страна добавлена!").Show();
					winCountryNew.Hide();
					grdCountry.Reload();
				}
				else
				{
					ExtNet.Msg.Notify("Ошибка", "Невозможно добавить страну!").Show();
				}

			}
			winCountryNew.Hide();
		}

		/// <summary>
		/// Очистить окно с добавлением страны
		/// </summary>
		protected void ClearAddWindow()
		{
			txtCountryCodeNew.Text = string.Empty;
			txtCountryISONew.Value = 0;
			txtCountryNameNew.Text = string.Empty;
		}

		/// <summary>
		/// Показать окно редактирования страны
		/// </summary>
		/// <param name="countryId">ID страны</param>
		protected void  ShowEditWindow(int countryId)
		{
			ClearEditWindow();
			DB.Country country = CountryManager.Get(countryId);
			if (country != null)
			{
				txtCountryCodeEdit.Text = country.Name;
				txtCountryISOEdit.Text = country.ISO.ToString();
				txtCountryNameEdit.Text = country.Name;
				Session["CountryID"] = country.ID;
				Session["CountryName"] = country.Name;
				winCountryEdit.Show();
			}

		}

		/// <summary>
		/// Редактирование существующей страны
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void BtnConfirmEditCountry(object sender, DirectEventArgs e)
		{
			int countryId = (int)Session["CountryID"];
			string oldName = (string) Session["CountryName"];
			string newName = txtCountryNameEdit.Text.Trim();

			if (newName == oldName)
			{
				// изменяем данные
				ChangeCountryData(countryId);
			}
			else
			{
				if (CountryManager.IsExsist(newName))
				{
					ExtNet.Msg.Notify("Сообщение", "Страна с таким название уже есть!").Show();
					txtCountryNameEdit.SelectText();
					txtCountryNameEdit.Focus();
					return;
				}
				else
				{
					// изменяем данные
					ChangeCountryData(countryId);
				}
			}
			winCountryEdit.Hide();
		}

		/// <summary>
		/// Изменение данных о стране
		/// </summary>
		/// <param name="countryId"></param>
		private void ChangeCountryData(int countryId)
		{
			string countryName = TextFormatHelper.FormatName(txtCountryNameEdit.Text);
			string countryCode = txtCountryCodeEdit.Text.ToUpper().Trim();
			int countryIso = int.Parse(txtCountryISOEdit.Text);

			CountryManager.Update(countryId, countryName, countryCode, countryIso);

			if (BusinessLogicManager.TryCommit())
			{
				ExtNet.Msg.Notify("Сообщение", "Данные изменены!").Show();
				winCountryEdit.Hide();
				grdCountry.Reload();
			}
			else
			{
				ExtNet.Msg.Notify("Ошибка", "Невозможно изменить данные!").Show();
			}
		}

		/// <summary>
		/// Очистка окна редактирования страны
		/// </summary>
		protected void ClearEditWindow()
		{
			txtCountryCodeEdit.Text = string.Empty;
			txtCountryISOEdit.Value = 0;
			txtCountryNameEdit.Text = string.Empty;
		}
	}
}